{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "48410055-4726-4ca8-b0ab-66818a43a424",
   "metadata": {},
   "source": [
    "# 数据清洗和数据集的准备"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "016dbd69-7a02-477b-8d9e-9e01721e862f",
   "metadata": {},
   "source": [
    "# 怎么用pandas清洗"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "004daba4-0904-4252-9356-a45544f8239b",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "1a3607aa-49b7-40cb-af2d-a25ce23cfd45",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 16 entries, 0 to 15\n",
      "Data columns (total 4 columns):\n",
      " #   Column  Non-Null Count  Dtype\n",
      "---  ------  --------------  -----\n",
      " 0   A       16 non-null     int32\n",
      " 1   B       16 non-null     int32\n",
      " 2   C       16 non-null     int32\n",
      " 3   D       16 non-null     int32\n",
      "dtypes: int32(4)\n",
      "memory usage: 384.0 bytes\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "      <th>D</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>4</td>\n",
       "      <td>6</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>8</td>\n",
       "      <td>10</td>\n",
       "      <td>12</td>\n",
       "      <td>14</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>16</td>\n",
       "      <td>18</td>\n",
       "      <td>20</td>\n",
       "      <td>22</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>24</td>\n",
       "      <td>26</td>\n",
       "      <td>28</td>\n",
       "      <td>30</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>32</td>\n",
       "      <td>34</td>\n",
       "      <td>36</td>\n",
       "      <td>38</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>40</td>\n",
       "      <td>42</td>\n",
       "      <td>44</td>\n",
       "      <td>46</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>48</td>\n",
       "      <td>50</td>\n",
       "      <td>52</td>\n",
       "      <td>54</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>56</td>\n",
       "      <td>58</td>\n",
       "      <td>60</td>\n",
       "      <td>62</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>64</td>\n",
       "      <td>66</td>\n",
       "      <td>68</td>\n",
       "      <td>70</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>72</td>\n",
       "      <td>74</td>\n",
       "      <td>76</td>\n",
       "      <td>78</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>80</td>\n",
       "      <td>82</td>\n",
       "      <td>84</td>\n",
       "      <td>86</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>88</td>\n",
       "      <td>90</td>\n",
       "      <td>92</td>\n",
       "      <td>94</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>96</td>\n",
       "      <td>98</td>\n",
       "      <td>100</td>\n",
       "      <td>102</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>104</td>\n",
       "      <td>106</td>\n",
       "      <td>108</td>\n",
       "      <td>110</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>112</td>\n",
       "      <td>114</td>\n",
       "      <td>116</td>\n",
       "      <td>118</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>120</td>\n",
       "      <td>122</td>\n",
       "      <td>124</td>\n",
       "      <td>126</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "      A    B    C    D\n",
       "0     0    2    4    6\n",
       "1     8   10   12   14\n",
       "2    16   18   20   22\n",
       "3    24   26   28   30\n",
       "4    32   34   36   38\n",
       "5    40   42   44   46\n",
       "6    48   50   52   54\n",
       "7    56   58   60   62\n",
       "8    64   66   68   70\n",
       "9    72   74   76   78\n",
       "10   80   82   84   86\n",
       "11   88   90   92   94\n",
       "12   96   98  100  102\n",
       "13  104  106  108  110\n",
       "14  112  114  116  118\n",
       "15  120  122  124  126"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "\n",
    "\n",
    "df = pd.DataFrame(np.arange(0,128,2).reshape(16,4),             #三行四列\n",
    "                  columns=['A', 'B', 'C', 'D'])\n",
    "df.info()\n",
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "61470d07-f58a-486c-b662-ac8612d527ca",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>D</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>6</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>8</td>\n",
       "      <td>10</td>\n",
       "      <td>14</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>16</td>\n",
       "      <td>18</td>\n",
       "      <td>22</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>24</td>\n",
       "      <td>26</td>\n",
       "      <td>30</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>32</td>\n",
       "      <td>34</td>\n",
       "      <td>38</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>40</td>\n",
       "      <td>42</td>\n",
       "      <td>46</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>48</td>\n",
       "      <td>50</td>\n",
       "      <td>54</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>56</td>\n",
       "      <td>58</td>\n",
       "      <td>62</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>64</td>\n",
       "      <td>66</td>\n",
       "      <td>70</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>72</td>\n",
       "      <td>74</td>\n",
       "      <td>78</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>80</td>\n",
       "      <td>82</td>\n",
       "      <td>86</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>88</td>\n",
       "      <td>90</td>\n",
       "      <td>94</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>96</td>\n",
       "      <td>98</td>\n",
       "      <td>102</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>104</td>\n",
       "      <td>106</td>\n",
       "      <td>110</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>112</td>\n",
       "      <td>114</td>\n",
       "      <td>118</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>120</td>\n",
       "      <td>122</td>\n",
       "      <td>126</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "      A    B    D\n",
       "0     0    2    6\n",
       "1     8   10   14\n",
       "2    16   18   22\n",
       "3    24   26   30\n",
       "4    32   34   38\n",
       "5    40   42   46\n",
       "6    48   50   54\n",
       "7    56   58   62\n",
       "8    64   66   70\n",
       "9    72   74   78\n",
       "10   80   82   86\n",
       "11   88   90   94\n",
       "12   96   98  102\n",
       "13  104  106  110\n",
       "14  112  114  118\n",
       "15  120  122  126"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.drop(['C'],axis=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "2752820a-5589-48cb-b4f8-47f7a3de1ad9",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "      <th>D</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>4</td>\n",
       "      <td>6</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>8</td>\n",
       "      <td>10</td>\n",
       "      <td>12</td>\n",
       "      <td>14</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>16</td>\n",
       "      <td>18</td>\n",
       "      <td>20</td>\n",
       "      <td>22</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>24</td>\n",
       "      <td>26</td>\n",
       "      <td>28</td>\n",
       "      <td>30</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>32</td>\n",
       "      <td>34</td>\n",
       "      <td>36</td>\n",
       "      <td>38</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>40</td>\n",
       "      <td>42</td>\n",
       "      <td>44</td>\n",
       "      <td>46</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>48</td>\n",
       "      <td>50</td>\n",
       "      <td>52</td>\n",
       "      <td>54</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>56</td>\n",
       "      <td>58</td>\n",
       "      <td>60</td>\n",
       "      <td>62</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>64</td>\n",
       "      <td>66</td>\n",
       "      <td>68</td>\n",
       "      <td>70</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>72</td>\n",
       "      <td>74</td>\n",
       "      <td>76</td>\n",
       "      <td>78</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>80</td>\n",
       "      <td>82</td>\n",
       "      <td>84</td>\n",
       "      <td>86</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>88</td>\n",
       "      <td>90</td>\n",
       "      <td>92</td>\n",
       "      <td>94</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>96</td>\n",
       "      <td>98</td>\n",
       "      <td>100</td>\n",
       "      <td>102</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>104</td>\n",
       "      <td>106</td>\n",
       "      <td>108</td>\n",
       "      <td>110</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>112</td>\n",
       "      <td>114</td>\n",
       "      <td>116</td>\n",
       "      <td>118</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>120</td>\n",
       "      <td>122</td>\n",
       "      <td>124</td>\n",
       "      <td>126</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "      A    B    C    D\n",
       "0     0    2    4    6\n",
       "1     8   10   12   14\n",
       "2    16   18   20   22\n",
       "3    24   26   28   30\n",
       "4    32   34   36   38\n",
       "5    40   42   44   46\n",
       "6    48   50   52   54\n",
       "7    56   58   60   62\n",
       "8    64   66   68   70\n",
       "9    72   74   76   78\n",
       "10   80   82   84   86\n",
       "11   88   90   92   94\n",
       "12   96   98  100  102\n",
       "13  104  106  108  110\n",
       "14  112  114  116  118\n",
       "15  120  122  124  126"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "d03f4600-3b93-444a-887d-3aca16673350",
   "metadata": {},
   "outputs": [],
   "source": [
    "df.drop(['C'],axis=1,inplace=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "d8e17b82-140e-4cfa-8e2c-e4de02bd9c54",
   "metadata": {},
   "outputs": [],
   "source": [
    "df = pd.DataFrame({\n",
    "    'id1': ['a', 'a', 'a', 'b', 'b', 'b'],\n",
    "    'id2': ['a1', 'a2', 'a2', 'b1', 'b2', 'b2'],\n",
    "    'x': [1, 2, 3, 4, 5, 5] ,\n",
    "    'y': [0.1, 0.3, 0.3, 0.4, 0.5, 0.5] ,\n",
    "})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "7302fe49-ccc5-468c-94e4-24ae4b5d35ed",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>id1</th>\n",
       "      <th>id2</th>\n",
       "      <th>x</th>\n",
       "      <th>y</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>a</td>\n",
       "      <td>a1</td>\n",
       "      <td>1</td>\n",
       "      <td>0.1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>a</td>\n",
       "      <td>a2</td>\n",
       "      <td>2</td>\n",
       "      <td>0.3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>a</td>\n",
       "      <td>a2</td>\n",
       "      <td>3</td>\n",
       "      <td>0.3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>b</td>\n",
       "      <td>b1</td>\n",
       "      <td>4</td>\n",
       "      <td>0.4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>b</td>\n",
       "      <td>b2</td>\n",
       "      <td>5</td>\n",
       "      <td>0.5</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  id1 id2  x    y\n",
       "0   a  a1  1  0.1\n",
       "1   a  a2  2  0.3\n",
       "2   a  a2  3  0.3\n",
       "3   b  b1  4  0.4\n",
       "4   b  b2  5  0.5"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.head()     # 默认前五行"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "065ea56a-7d18-4850-a844-ebeec7baf2a3",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0    False\n",
       "1    False\n",
       "2    False\n",
       "3    False\n",
       "4    False\n",
       "5     True\n",
       "dtype: bool"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.duplicated()    # 某某数据是重复的"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "2d05fe1e-a0cd-4f1a-8ff1-176db158793f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>id1</th>\n",
       "      <th>id2</th>\n",
       "      <th>x</th>\n",
       "      <th>y</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>b</td>\n",
       "      <td>b2</td>\n",
       "      <td>5</td>\n",
       "      <td>0.5</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  id1 id2  x    y\n",
       "5   b  b2  5  0.5"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df[df.duplicated()]   # 显示df中重复的数据"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "47f59526-c073-4edf-bf99-225a2e52a9ba",
   "metadata": {},
   "source": [
    "## 课堂练习"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "87bcf76f-2123-419f-ab91-f1eccc554aca",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>wave</th>\n",
       "      <th>flam</th>\n",
       "      <th>noise</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>11436.9</td>\n",
       "      <td>-1.795000e-17</td>\n",
       "      <td>5.534000e-17</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>11439.2</td>\n",
       "      <td>1.203000e-16</td>\n",
       "      <td>4.374000e-17</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>11441.4</td>\n",
       "      <td>1.857000e-17</td>\n",
       "      <td>4.261000e-17</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>11443.7</td>\n",
       "      <td>-1.751000e-16</td>\n",
       "      <td>3.584000e-17</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>11446.0</td>\n",
       "      <td>-8.348000e-17</td>\n",
       "      <td>3.160000e-17</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "      wave          flam         noise\n",
       "0  11436.9 -1.795000e-17  5.534000e-17\n",
       "1  11439.2  1.203000e-16  4.374000e-17\n",
       "2  11441.4  1.857000e-17  4.261000e-17\n",
       "3  11443.7 -1.751000e-16  3.584000e-17\n",
       "4  11446.0 -8.348000e-17  3.160000e-17"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df1 = pd.read_table(\"../astro-pandas-tutorials/Sample_data/rcs0327_knotU_N3_nirspeckeck.txt\", delim_whitespace=True, comment=\"#\")\n",
    "df1.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "95f58d5f-4c93-46f6-a274-4de82e06576e",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 1121 entries, 0 to 1120\n",
      "Data columns (total 3 columns):\n",
      " #   Column  Non-Null Count  Dtype  \n",
      "---  ------  --------------  -----  \n",
      " 0   wave    1121 non-null   float64\n",
      " 1   flam    1107 non-null   float64\n",
      " 2   noise   1121 non-null   float64\n",
      "dtypes: float64(3)\n",
      "memory usage: 26.4 KB\n"
     ]
    }
   ],
   "source": [
    "df1.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "4306b1c3-6d30-4e93-b409-845a810aed9f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>wave</th>\n",
       "      <th>flam</th>\n",
       "      <th>noise</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>1121.000000</td>\n",
       "      <td>1.107000e+03</td>\n",
       "      <td>1.121000e+03</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>12819.974844</td>\n",
       "      <td>1.633409e-17</td>\n",
       "      <td>2.663281e-16</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>830.235363</td>\n",
       "      <td>4.336269e-16</td>\n",
       "      <td>2.096674e-15</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>11436.900000</td>\n",
       "      <td>-1.031000e-14</td>\n",
       "      <td>0.000000e+00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>12096.000000</td>\n",
       "      <td>-5.886500e-19</td>\n",
       "      <td>3.083000e-18</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>12793.100000</td>\n",
       "      <td>3.920000e-18</td>\n",
       "      <td>5.154000e-18</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>13530.400000</td>\n",
       "      <td>1.009500e-17</td>\n",
       "      <td>1.115000e-17</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>14310.200000</td>\n",
       "      <td>4.415000e-15</td>\n",
       "      <td>5.516000e-14</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "               wave          flam         noise\n",
       "count   1121.000000  1.107000e+03  1.121000e+03\n",
       "mean   12819.974844  1.633409e-17  2.663281e-16\n",
       "std      830.235363  4.336269e-16  2.096674e-15\n",
       "min    11436.900000 -1.031000e-14  0.000000e+00\n",
       "25%    12096.000000 -5.886500e-19  3.083000e-18\n",
       "50%    12793.100000  3.920000e-18  5.154000e-18\n",
       "75%    13530.400000  1.009500e-17  1.115000e-17\n",
       "max    14310.200000  4.415000e-15  5.516000e-14"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df1.describe()      #数据情况"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "2a467d6b-36f3-4c7c-a06c-7588168226ae",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>wave</th>\n",
       "      <th>flam</th>\n",
       "      <th>noise</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1116</th>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1117</th>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1118</th>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1119</th>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1120</th>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>1121 rows × 3 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "       wave   flam  noise\n",
       "0     False  False  False\n",
       "1     False  False  False\n",
       "2     False  False  False\n",
       "3     False  False  False\n",
       "4     False  False  False\n",
       "...     ...    ...    ...\n",
       "1116  False   True  False\n",
       "1117  False   True  False\n",
       "1118  False   True  False\n",
       "1119  False   True  False\n",
       "1120  False   True  False\n",
       "\n",
       "[1121 rows x 3 columns]"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df1.isnull()     #显示“是无值的”数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "e782c307-163b-4135-9cf1-c3bc6b01c966",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "wave      0\n",
       "flam     14\n",
       "noise     0\n",
       "dtype: int64"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df1.isnull().sum()           # 统计无值的数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "6462413e-3d84-4c77-83ee-69a96ef077a1",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>wave</th>\n",
       "      <th>flam</th>\n",
       "      <th>noise</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>1107</th>\n",
       "      <td>14273.1</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1108</th>\n",
       "      <td>14275.9</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1109</th>\n",
       "      <td>14278.8</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1110</th>\n",
       "      <td>14281.6</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1111</th>\n",
       "      <td>14284.5</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1112</th>\n",
       "      <td>14287.3</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1113</th>\n",
       "      <td>14290.2</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1114</th>\n",
       "      <td>14293.1</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1115</th>\n",
       "      <td>14295.9</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1116</th>\n",
       "      <td>14298.8</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1117</th>\n",
       "      <td>14301.6</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1118</th>\n",
       "      <td>14304.5</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1119</th>\n",
       "      <td>14307.4</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1120</th>\n",
       "      <td>14310.2</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "         wave  flam  noise\n",
       "1107  14273.1   NaN    0.0\n",
       "1108  14275.9   NaN    0.0\n",
       "1109  14278.8   NaN    0.0\n",
       "1110  14281.6   NaN    0.0\n",
       "1111  14284.5   NaN    0.0\n",
       "1112  14287.3   NaN    0.0\n",
       "1113  14290.2   NaN    0.0\n",
       "1114  14293.1   NaN    0.0\n",
       "1115  14295.9   NaN    0.0\n",
       "1116  14298.8   NaN    0.0\n",
       "1117  14301.6   NaN    0.0\n",
       "1118  14304.5   NaN    0.0\n",
       "1119  14307.4   NaN    0.0\n",
       "1120  14310.2   NaN    0.0"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df1.loc[df1['flam'].isnull()]         # 显示无值的数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "f225a933-ab35-4c7c-a6f3-d0fe9e371b5a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>wave</th>\n",
       "      <th>flam</th>\n",
       "      <th>noise</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>11436.9</td>\n",
       "      <td>-1.795000e-17</td>\n",
       "      <td>5.534000e-17</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>11439.2</td>\n",
       "      <td>1.203000e-16</td>\n",
       "      <td>4.374000e-17</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>11441.4</td>\n",
       "      <td>1.857000e-17</td>\n",
       "      <td>4.261000e-17</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>11443.7</td>\n",
       "      <td>-1.751000e-16</td>\n",
       "      <td>3.584000e-17</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>11446.0</td>\n",
       "      <td>-8.348000e-17</td>\n",
       "      <td>3.160000e-17</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1102</th>\n",
       "      <td>14258.8</td>\n",
       "      <td>-6.567000e-16</td>\n",
       "      <td>1.790000e-15</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1103</th>\n",
       "      <td>14261.6</td>\n",
       "      <td>6.010000e-16</td>\n",
       "      <td>1.733000e-15</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1104</th>\n",
       "      <td>14264.5</td>\n",
       "      <td>4.865000e-16</td>\n",
       "      <td>1.258000e-15</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1105</th>\n",
       "      <td>14267.3</td>\n",
       "      <td>8.818000e-16</td>\n",
       "      <td>1.030000e-15</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1106</th>\n",
       "      <td>14270.2</td>\n",
       "      <td>2.246000e-16</td>\n",
       "      <td>1.618000e-15</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>1107 rows × 3 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "         wave          flam         noise\n",
       "0     11436.9 -1.795000e-17  5.534000e-17\n",
       "1     11439.2  1.203000e-16  4.374000e-17\n",
       "2     11441.4  1.857000e-17  4.261000e-17\n",
       "3     11443.7 -1.751000e-16  3.584000e-17\n",
       "4     11446.0 -8.348000e-17  3.160000e-17\n",
       "...       ...           ...           ...\n",
       "1102  14258.8 -6.567000e-16  1.790000e-15\n",
       "1103  14261.6  6.010000e-16  1.733000e-15\n",
       "1104  14264.5  4.865000e-16  1.258000e-15\n",
       "1105  14267.3  8.818000e-16  1.030000e-15\n",
       "1106  14270.2  2.246000e-16  1.618000e-15\n",
       "\n",
       "[1107 rows x 3 columns]"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df1.dropna(how='any',axis=0)"
   ]
  },
  {
   "cell_type": "raw",
   "id": "c7c776c5-4f59-4d7a-9775-839ebbe1f552",
   "metadata": {},
   "source": [
    "isnull()  info()   describe()\n",
    "\n",
    "通用删除：删除列 df.drop(['列标签'], axis=1) ，删除行 df.drop(['行标签'], axis=0)      \n",
    "    \n",
    "缺失：isnull() / notsull()---.dropna(how='any',axis=0)    筛选缺失项---删去有缺失项的整行（any）\n",
    "    df1.isnull().sum() 统计无值的数据位,   df1.loc[df1['列标签'].isnull()] 显示无值的数据\n",
    "    \n",
    "    \n",
    "重复： df1.drop_duplicated(subset=None, keep='first')   筛选并删去重复项，保留重复项中的第一项\n",
    "    df.duplicated(['列表签（指定筛选列，可无此项）'], keep=False)  标记所有重复项\n",
    "\n",
    "\n",
    "超出合理范围： \n",
    "    incomes_sigma = incomes.std()   计算数据方差并保存成一个Dataframe文件\n",
    "    incomes.loc[abs(incomes['it']) > 8 * incomes_sigma['it'], 'it']    根据方差筛选出异常数据，并查看\n",
    "    df.drop(['行标签'], axis=0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "566889cf-f02b-4eb7-8540-1160a1ffc7e7",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df1.duplicated().sum()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "036810c0-c5ac-4fa0-8cac-04e72d0d540f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0       False\n",
       "1       False\n",
       "2       False\n",
       "3       False\n",
       "4       False\n",
       "        ...  \n",
       "1116    False\n",
       "1117    False\n",
       "1118    False\n",
       "1119    False\n",
       "1120    False\n",
       "Length: 1121, dtype: bool"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df1.duplicated(subset=None, keep='first')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7e4de79c-d3a2-4096-8954-2b7577ecb4b5",
   "metadata": {},
   "source": [
    "# 线性回归中最小二乘与机器学习算法的区别"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "b1419e39-7d3d-495b-9190-4d403e23b275",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import scipy as sp\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "import sklearn\n",
    "\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "b6eb69be-6f28-48fc-8c25-9a33b32397bc",
   "metadata": {},
   "outputs": [],
   "source": [
    "import matplotlib\n",
    "# 指定默认字体  \n",
    "matplotlib.rcParams['font.family']='sans-serif'  \n",
    "matplotlib.rcParams['font.sans-serif'] = ['SimHei']   \n",
    "#解决负号'-'显示为方块的问题  \n",
    "matplotlib.rcParams['axes.unicode_minus'] = False "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4efef7dd-9d6f-4548-bf63-801d64086668",
   "metadata": {},
   "source": [
    "## 作业\n",
    "    1.Y = AX+B(自行定义A、B的值)\n",
    "    X的范围是（0，19），计算Y的值，并画出直线\n",
    "    X(numpy.array([0,1,2……,19]))\n",
    "    Y(numpy.array(AX+B))\n",
    "    2.加一些噪声（Numpy.randome.normal()）求加噪声之后拟合的直线斜率和截距"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "295fa245-f6e2-4f02-96d6-fc1bb1dbb7cf",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import scipy as sp\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "import sklearn\n",
    "\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "eca587ac-f155-4e04-80af-565a3ad3d26f",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19] [10, 13, 16, 19, 22, 25, 28, 31, 34, 37, 40, 43, 46, 49, 52, 55, 58, 61, 64, 67]\n"
     ]
    }
   ],
   "source": [
    "# 第一题：不加入噪声\n",
    "\n",
    "A=3\n",
    "B=10\n",
    "X_data=[]\n",
    "y_data=[]\n",
    "for i in range(20):\n",
    "    X_data.append(i)\n",
    "    y_data.append(A*i+B)\n",
    "\n",
    "print(X_data,y_data)\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "f65d023a-1b97-46b0-b405-d5709f509a47",
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.linear_model import LinearRegression     # 线性模型，线性回归\n",
    "\n",
    "X_train = np.array(X_data).reshape(-1, 1)\n",
    "y_train = np.array(y_data)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "77bbf1a3-f863-447a-a6d7-e1cbe3206cde",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>#sk-container-id-2 {color: black;background-color: white;}#sk-container-id-2 pre{padding: 0;}#sk-container-id-2 div.sk-toggleable {background-color: white;}#sk-container-id-2 label.sk-toggleable__label {cursor: pointer;display: block;width: 100%;margin-bottom: 0;padding: 0.3em;box-sizing: border-box;text-align: center;}#sk-container-id-2 label.sk-toggleable__label-arrow:before {content: \"▸\";float: left;margin-right: 0.25em;color: #696969;}#sk-container-id-2 label.sk-toggleable__label-arrow:hover:before {color: black;}#sk-container-id-2 div.sk-estimator:hover label.sk-toggleable__label-arrow:before {color: black;}#sk-container-id-2 div.sk-toggleable__content {max-height: 0;max-width: 0;overflow: hidden;text-align: left;background-color: #f0f8ff;}#sk-container-id-2 div.sk-toggleable__content pre {margin: 0.2em;color: black;border-radius: 0.25em;background-color: #f0f8ff;}#sk-container-id-2 input.sk-toggleable__control:checked~div.sk-toggleable__content {max-height: 200px;max-width: 100%;overflow: auto;}#sk-container-id-2 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {content: \"▾\";}#sk-container-id-2 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-2 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-2 input.sk-hidden--visually {border: 0;clip: rect(1px 1px 1px 1px);clip: rect(1px, 1px, 1px, 1px);height: 1px;margin: -1px;overflow: hidden;padding: 0;position: absolute;width: 1px;}#sk-container-id-2 div.sk-estimator {font-family: monospace;background-color: #f0f8ff;border: 1px dotted black;border-radius: 0.25em;box-sizing: border-box;margin-bottom: 0.5em;}#sk-container-id-2 div.sk-estimator:hover {background-color: #d4ebff;}#sk-container-id-2 div.sk-parallel-item::after {content: \"\";width: 100%;border-bottom: 1px solid gray;flex-grow: 1;}#sk-container-id-2 div.sk-label:hover label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-2 div.sk-serial::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: 0;}#sk-container-id-2 div.sk-serial {display: flex;flex-direction: column;align-items: center;background-color: white;padding-right: 0.2em;padding-left: 0.2em;position: relative;}#sk-container-id-2 div.sk-item {position: relative;z-index: 1;}#sk-container-id-2 div.sk-parallel {display: flex;align-items: stretch;justify-content: center;background-color: white;position: relative;}#sk-container-id-2 div.sk-item::before, #sk-container-id-2 div.sk-parallel-item::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: -1;}#sk-container-id-2 div.sk-parallel-item {display: flex;flex-direction: column;z-index: 1;position: relative;background-color: white;}#sk-container-id-2 div.sk-parallel-item:first-child::after {align-self: flex-end;width: 50%;}#sk-container-id-2 div.sk-parallel-item:last-child::after {align-self: flex-start;width: 50%;}#sk-container-id-2 div.sk-parallel-item:only-child::after {width: 0;}#sk-container-id-2 div.sk-dashed-wrapped {border: 1px dashed gray;margin: 0 0.4em 0.5em 0.4em;box-sizing: border-box;padding-bottom: 0.4em;background-color: white;}#sk-container-id-2 div.sk-label label {font-family: monospace;font-weight: bold;display: inline-block;line-height: 1.2em;}#sk-container-id-2 div.sk-label-container {text-align: center;}#sk-container-id-2 div.sk-container {/* jupyter's `normalize.less` sets `[hidden] { display: none; }` but bootstrap.min.css set `[hidden] { display: none !important; }` so we also need the `!important` here to be able to override the default hidden behavior on the sphinx rendered scikit-learn.org. See: https://github.com/scikit-learn/scikit-learn/issues/21755 */display: inline-block !important;position: relative;}#sk-container-id-2 div.sk-text-repr-fallback {display: none;}</style><div id=\"sk-container-id-2\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>LinearRegression()</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-2\" type=\"checkbox\" checked><label for=\"sk-estimator-id-2\" class=\"sk-toggleable__label sk-toggleable__label-arrow\">LinearRegression</label><div class=\"sk-toggleable__content\"><pre>LinearRegression()</pre></div></div></div></div></div>"
      ],
      "text/plain": [
       "LinearRegression()"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 构建模型\n",
    "regr = LinearRegression()\n",
    "regr.fit(X_train, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "591ad174-c47f-4321-8bc9-227c5a93b446",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(array([3.]), 9.999999999999986)"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "regr.coef_, regr.intercept_             #coefficient:系数, interception:截距"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "id": "e8e92a95-7921-4e68-9a9d-f91db3f403ec",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x261af624b50>]"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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k6noZ7Ky61ipqKiIW265hdLSUl588cVTLtupU6dyX9js2rUrl156Kc8//zzPPfdcdUetsJtvvrnsv+Pi4mjfvj3Nmzfn3XffPeVB2tv2IcBrr73GbbfddtrvbnjqPjzVscHTPoc+c+YjLCwMm812XCvLyso6rr0dFRERccLl/f39adSoUbVlPRv33XcfK1as4JNPPqFp06YVXr9Tp06Wt/MzVbduXdq0aXPSvN64/wB27drFhx9+yF133VXhdb1p/x39pVJFPpNH16voOlYqKiripptuIj09nZSUlAo/otzPz48OHTp4zX51Op00b978lHm9bR8CfPrpp2zdurVSn0tP2IcnOzZ46ufQZ8pHYGAg7dq1K/sFwVEpKSl06dLlhOt07tz5uOVXr15N+/btCQgIqLaslWGaJmPGjCE5OZmPP/6YmJiYSr3Ppk2bcDqdVZyuehQUFPDjjz+eNK837b8/mzt3Lk2aNOG6666r8LretP9iYmKIiIgot48KCwtJTU096WcSTr5fT7WOVY4Wj+3bt/Phhx9WqvSapsk333zjNft1//797Nmz55R5vWkfHjVnzhzatWvHxRdfXOF1rdyHpzs2eOznsEq+tuoh3n77bTMgIMCcM2eO+cMPP5iJiYlm3bp1zZ07d5qmaZoTJkwwb7/99rLld+zYYQYHB5sPPvig+cMPP5hz5swxAwICzMWLF1u1CSd17733mg6Hw1yzZo2ZkZFR9srLyytb5tjt+/e//20uXbrU3LZtm/n999+bEyZMMAFzyZIlVmzCaf31r38116xZY+7YscPcsGGDef3115shISE+sf+OKikpMZs1a2aOHz/+uHneuP9yc3PNTZs2mZs2bTIBc/r06eamTZvKfu3x5JNPmg6Hw0xOTjY3b95s3nrrrabT6TRzcnLK3uP2228v94u0zz77zLTZbOaTTz5p/vjjj+aTTz5p+vv7mxs2bPCo7SsqKjL79etnNm3a1Pzmm2/KfS4LCgpOun2TJ082V61aZf7yyy/mpk2bzGHDhpn+/v7mF198UePbZ5qn3sbc3Fzzr3/9q7l+/XozPT3d/OSTT8zOnTub55xzjk/sw6NcLpcZHBxszpo164Tv4cn78EyODZ74OfSp8mGapvnCCy+YzZs3NwMDA81LL7203E9RhwwZYnbv3r3c8mvWrDHbtm1rBgYGmtHR0Sf9y2c14ISvuXPnli1z7PZNnTrVbNGihVmnTh2zQYMG5uWXX26+++67NR/+DN18882m0+k0AwICzMjISDMhIcHcsmVL2Xxv3n9HffDBByZgbt269bh53rj/jv4c+NjXkCFDTNN0/8xv0qRJZkREhGm3281u3bqZmzdvLvce3bt3L1v+qEWLFpktW7Y0AwICzFatWllWuE61fenp6Sf9XH7yySdl73Hs9iUmJprNmjUzAwMDzcaNG5vx8fHm+vXra37j/utU25iXl2fGx8ebjRs3NgMCAsxmzZqZQ4YMMXfv3l3uPbx1Hx718ssvm0FBQebBgwdP+B6evA/P5NjgiZ9D47/hRURERGqEz3znQ0RERLyDyoeIiIjUKJUPERERqVEqHyIiIlKjVD5ERESkRql8iIiISI1S+RAREZEapfIhIiIiNUrlQ0RERGqUyoeIiIjUKJUPERERqVEqHyIiIlKj/h/gZEy02cNAaAAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "x = np.arange(0, 20, 0.02).reshape(-1, 1)\n",
    "y = regr.predict(x)\n",
    "\n",
    "plt.plot(X_train, y_train, '.')\n",
    "\n",
    "plt.plot(x[:, 0], y)\n",
    "#plt.title('线性模型拟合结果{}'.format(regr.coef_))\n",
    "#plt.title('线性模型拟合结果：斜率 = {}'.format(regr.coef_[0]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "e2fd823c-47b9-4df9-8a15-acb75630aeaf",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 第二题：加入噪声"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "id": "177d5508-e940-4949-aff4-1b44052a9d03",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19] [9.396246081036109, 13.552290050581542, 12.135359198726027, 21.18012192840821, 22.77355719394903, 20.880874780471867, 31.611892135351756, 30.131506062820897, 36.731236443127386, 38.6765524347029, 40.4863244719017, 45.829768223640635, 40.774839299902524, 50.852185636036324, 55.658476086724626, 57.99845803735013, 58.7524138985074, 64.54392989626623, 67.97051667470751, 67.25742473143823]\n"
     ]
    }
   ],
   "source": [
    "A=3\n",
    "B=10\n",
    "X_data=[]\n",
    "y_data=[]\n",
    "\n",
    "y0 = 0  # 你可以根据需要更改这个值\n",
    "variance = 10\n",
    "std_dev = np.sqrt(variance)\n",
    "\n",
    "y_noise=np.random.normal(y0, std_dev, 20)\n",
    "y_noise_list =y_noise.tolist()\n",
    "\n",
    "\n",
    "for i in range(20):\n",
    "    X_data.append(i)\n",
    "    y_data.append(A*i+B+y_noise_list[i])\n",
    "\n",
    "print(X_data,y_data)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "id": "8324a21a-efdd-4e91-98d8-ac6038a63a01",
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.linear_model import LinearRegression     # 线性模型，线性回归\n",
    "\n",
    "X_train = np.array(X_data).reshape(-1, 1)\n",
    "y_train = np.array(y_data)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "id": "006e08ba-5b72-47e3-8f76-2a102b975622",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>#sk-container-id-3 {color: black;background-color: white;}#sk-container-id-3 pre{padding: 0;}#sk-container-id-3 div.sk-toggleable {background-color: white;}#sk-container-id-3 label.sk-toggleable__label {cursor: pointer;display: block;width: 100%;margin-bottom: 0;padding: 0.3em;box-sizing: border-box;text-align: center;}#sk-container-id-3 label.sk-toggleable__label-arrow:before {content: \"▸\";float: left;margin-right: 0.25em;color: #696969;}#sk-container-id-3 label.sk-toggleable__label-arrow:hover:before {color: black;}#sk-container-id-3 div.sk-estimator:hover label.sk-toggleable__label-arrow:before {color: black;}#sk-container-id-3 div.sk-toggleable__content {max-height: 0;max-width: 0;overflow: hidden;text-align: left;background-color: #f0f8ff;}#sk-container-id-3 div.sk-toggleable__content pre {margin: 0.2em;color: black;border-radius: 0.25em;background-color: #f0f8ff;}#sk-container-id-3 input.sk-toggleable__control:checked~div.sk-toggleable__content {max-height: 200px;max-width: 100%;overflow: auto;}#sk-container-id-3 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {content: \"▾\";}#sk-container-id-3 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-3 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-3 input.sk-hidden--visually {border: 0;clip: rect(1px 1px 1px 1px);clip: rect(1px, 1px, 1px, 1px);height: 1px;margin: -1px;overflow: hidden;padding: 0;position: absolute;width: 1px;}#sk-container-id-3 div.sk-estimator {font-family: monospace;background-color: #f0f8ff;border: 1px dotted black;border-radius: 0.25em;box-sizing: border-box;margin-bottom: 0.5em;}#sk-container-id-3 div.sk-estimator:hover {background-color: #d4ebff;}#sk-container-id-3 div.sk-parallel-item::after {content: \"\";width: 100%;border-bottom: 1px solid gray;flex-grow: 1;}#sk-container-id-3 div.sk-label:hover label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-3 div.sk-serial::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: 0;}#sk-container-id-3 div.sk-serial {display: flex;flex-direction: column;align-items: center;background-color: white;padding-right: 0.2em;padding-left: 0.2em;position: relative;}#sk-container-id-3 div.sk-item {position: relative;z-index: 1;}#sk-container-id-3 div.sk-parallel {display: flex;align-items: stretch;justify-content: center;background-color: white;position: relative;}#sk-container-id-3 div.sk-item::before, #sk-container-id-3 div.sk-parallel-item::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: -1;}#sk-container-id-3 div.sk-parallel-item {display: flex;flex-direction: column;z-index: 1;position: relative;background-color: white;}#sk-container-id-3 div.sk-parallel-item:first-child::after {align-self: flex-end;width: 50%;}#sk-container-id-3 div.sk-parallel-item:last-child::after {align-self: flex-start;width: 50%;}#sk-container-id-3 div.sk-parallel-item:only-child::after {width: 0;}#sk-container-id-3 div.sk-dashed-wrapped {border: 1px dashed gray;margin: 0 0.4em 0.5em 0.4em;box-sizing: border-box;padding-bottom: 0.4em;background-color: white;}#sk-container-id-3 div.sk-label label {font-family: monospace;font-weight: bold;display: inline-block;line-height: 1.2em;}#sk-container-id-3 div.sk-label-container {text-align: center;}#sk-container-id-3 div.sk-container {/* jupyter's `normalize.less` sets `[hidden] { display: none; }` but bootstrap.min.css set `[hidden] { display: none !important; }` so we also need the `!important` here to be able to override the default hidden behavior on the sphinx rendered scikit-learn.org. See: https://github.com/scikit-learn/scikit-learn/issues/21755 */display: inline-block !important;position: relative;}#sk-container-id-3 div.sk-text-repr-fallback {display: none;}</style><div id=\"sk-container-id-3\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>LinearRegression()</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-3\" type=\"checkbox\" checked><label for=\"sk-estimator-id-3\" class=\"sk-toggleable__label sk-toggleable__label-arrow\">LinearRegression</label><div class=\"sk-toggleable__content\"><pre>LinearRegression()</pre></div></div></div></div></div>"
      ],
      "text/plain": [
       "LinearRegression()"
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 构建模型\n",
    "regr = LinearRegression()\n",
    "regr.fit(X_train, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "id": "366ada0e-4e53-4497-a555-8c04c4400e1a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(array([3.17031354]), 9.2417200051054)"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "regr.coef_, regr.intercept_             #coefficient:系数, interception:截距"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "id": "7c98bd43-b644-4ad6-8796-87f0d7797679",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x261af2ac0d0>]"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "x = np.arange(0, 20, 0.02).reshape(-1, 1)\n",
    "y = regr.predict(x)\n",
    "\n",
    "plt.plot(X_train, y_train, '.')\n",
    "\n",
    "plt.plot(x[:, 0], y)\n",
    "#plt.title('线性模型拟合结果{}'.format(regr.coef_))\n",
    "#plt.title('线性模型拟合结果：斜率 = {}'.format(regr.coef_[0]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "108486fa-3361-45fb-9fc9-df049ca51ecb",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "c1bb6d1f-e59e-4334-8058-58e453bc3782",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "a70dbe90-b6c0-4517-997a-78d06c388f95",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "992c09a6-3af3-4136-85d7-2bb3833d36d4",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
